package com.itheima.reggie.common;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.UUID;

@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {

    // 获取配置文件中的地址
    @Value("${reggie.path}")
    private String filePath;

    /**
     * 文件上传
     *      // 默认文件上传保存在一个默认的文件夹中，一旦程序停止，文件将自动删除
     *      需要将文件永久的保存到磁盘中 D:\imgas\reggie中
     * @param file  上传文件的具体信息
     * @return
     */
    @PostMapping("/upload")
    public R upload(MultipartFile file) {
        log.info("文件的信息：{}", file);
        
        // 获取文件的名称
        String originalFilename = file.getOriginalFilename();
        // 截取原文件的扩展名
        String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 使用UUID和后缀名拼接成一个新的文件名称
        String fileName = UUID.randomUUID().toString() + fileSuffix;

        // 创建一个文件对象，判断是否存在，如果不存在创建目录
        File file1 = new File(filePath);
        if (!file1.exists()) {
            file1.mkdirs();
        }

        // 将文件存储的到磁盘中
        try {
            file.transferTo(Paths.get(filePath, fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 将文件的名称返回
        return R.success(fileName);
    }


    /**
     * 文件的下载，方式一：将文件展示在页面上
     *          方式二：将文件以附件的形式下载到本地，需要在方式一的基础上添加一个响应头信息
     *
     * @param name
     */
    @GetMapping("/download")
    public void download(HttpServletResponse response,String name) {
        log.info("文件的名称：{}", name);
        try {
            // 获取图片的位置
            String path = filePath + name;
            // 将文件读取到内存中
            byte[] bytes = FileCopyUtils.copyToByteArray(new File(path));

            // 将文件以字节数组的形式发送给客户端
            response.getOutputStream().write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
